Учебник по OpenXava 3

Приветствуем вас в кратком учебном руководстве по OpenXava.
В данном руководстве предполагается, что вы уже установили и запустили Tomcat, поставляемый вместе с OpenXava (start-tomcat.sh или .bat уже выполнены), у вас установлен Eclipse IDE.
В среде Eclipse откройте набор проектов (workspace), поставляемый вместе дистрибутивом OpenXava (находится в папке workspace дистрибутива).

Запуск учебного приложения MySchool

В комплект дистрибутива OpenXava входит учебное приложение MySchool. Следуйте ниже описанным рекомендациям, чтобы разобраться с приложением.
Для сборки и запуска приложения используются Ant. Для того, чтобы запустить приложение из Eclipse, нужно просто нажать кнопкуexternal-tools.gif в меню External Tools среды Eclipse.

Добавление функциональности в учебное приложение MySchool

Добавление нового бизнес-компонента и модуля для поддержки данного компонента

Скопируйте файл src/org.openxava.school.model/Teacher.java в новый файл Pupil.java.
Модифицируйте его, например, как показано ниже:
package org.openxava.school.model;
 
import javax.persistence.*;
import org.openxava.annotations.*;
 
@Entity
public class Pupil {
 
@Id @Column(length=2) @Required
private int number;
 
@Column(length=40) @Required
private String name;
 
public int getNumber() {
return number;
}
 
public void setNumber(int number) {
this.number = number;
}
 
public String getName() {
return name;
}
 
public void setName(String name) {
this.name = name;
}
 
}
После этого мы можем развернуть наше приложение на тестовом сервере приложений.
Спешу напомнить, что запуск целей ant осуществляется кнопкойexternal-tools.gifв меню External Tools.

Реализация связи "Ученики"-"Учитель" (Многие-к-Одному)

Нет ничего проще, чем сделать такую ссылку. Добавьте в класс Pupil следующий код:
@ManyToOne
private Teacher teacher;
 
public Teacher getTeacher() {
return teacher;
}
 
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
Давайте протестируем то, что получилось:
Ву-аля, как вы видите, все работает.
Если вы хотите, чтобы ссылка отображалась в виде combo-списка, добавьте @DescriptionsList в ссылку на teacher внутри Pupil, как указано ниже:
@ManyToOne @DescriptionsList
private Teacher teacher;
Заметим, что @DescriptionsList - это аннотация.
После выше указанных изменений, класс Pupil должен выглядеть примерно так:
package org.openxava.school.model;
 
import javax.persistence.*;
import org.openxava.annotations.*;
 
@Entity
public class Pupil {
 
@Id @Column(length=2) @Required
private int number;
 
@Column(length=40) @Required
private String name;
 
@ManyToOne @DescriptionsList
private Teacher teacher;
 
public int getNumber() {
return number;
}
 
public void setNumber(int number) {
this.number = number;
}
 
public String getName() {
return name;
}
 
public void setName(String name) {
this.name = name;
}
 
public Teacher getTeacher() {
return teacher;
}
 
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
 
}
Попробуем запустить еще раз:
А теперь давайте попробуем разместить коллекцию учеников в класс Teacher (Учитель). Для начала добавим оператор import со ссылкой на стандартный пакет Java, где реализованы коллекции, в класс Teacher:
import java.util.*;
Далее необходимо вставить объявление коллекции в код:
@OneToMany(mappedBy="teacher")
private Collection<Pupil> pupils;
 
public Collection<Pupil> getPupils() {
return pupils;
}
 
public void setPupils(Collection<Pupil> pupils) {
this.pupils = pupils;
}
 
После всех этих изменений Teacher class будет выглядеть следующим образом:
package org.openxava.school.model;
 
import java.util.*;
import javax.persistence.*;
import org.openxava.annotations.*;
 
@Entity
public class Teacher {
 
@Id @Column(length=5) @Required
private String id;
 
@Column(length=40) @Required
private String name;
 
@OneToMany(mappedBy="teacher")
private Collection<Pupil> pupils;
 
public String getId() {
return id;
}
 
public void setId(String id) {
this.id = id;
}
 
public String getName() {
return name;
}
 
public void setName(String name) {
this.name = name;
}
 
public Collection<Pupil> getPupils() {
return pupils;
}
 
public void setPupils(Collection<Pupil> pupils) {
this.pupils = pupils;
}
 
}
Еще раз выполним приложение:

Запуск модульных тестов junit для приложения MySchool

Перейдите в проект MySchool внутри Eclipse:
  • Откройте класс TeacherTest (он расположен в src/org.openxava.school.tests), затем в контекстном меню (открывается кликом по правой кнопке мыши) выберите Run > JUnit Test
Основанные на junit модульные тесты OpenXava позволяют тестировать ваш программный код, имитируя поведение реального пользователя, выполняющего навигацию в Интернет. Использование junut позволяет автоматизировать процесс тестирования приложения. Вы можете ознакомиться с кодом класса TeachersTest, чтобы получить дополнительные идеи о том, как реализовать junit тесты для OpenXava.
Если вы хотите создавать качественные приложения, важно потратить усилия на создания junit тестов.

В заключение

Это все, уважаемые читатели.
В данном примере мы наглядно показали каких существенных результатов с весьма небольшими усилиями позволяет добиться OpenXava.

Дополнительная помощь

Если у вас будет желание ознакомиться со всеми возможностями OpenXava, которые, естественно, не вошли в данный простейший пример, вам необходимо обратить свое внимание к проекту OpenXavaTest; в частности, к пакету java5-src/org.openxava.test.model.

Обратитесь к форуму OpenXava, если у вас возникли вопросы или проблемы с примерами из данного учебного руководства:
http://sourceforge.net/forum/forum.php?forum_id=419690

Дополнительную информацию по OpenXava можно найти: